package Verwaltung.Daten;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import Verwaltung.Daten.Interfaces.IAktivitaet;
import Verwaltung.Daten.Interfaces.IKlasse;
import Verwaltung.Daten.Interfaces.ILehrkraft;

public class Aktivitaet implements IAktivitaet {

	private int iD;
	private int tstarth;
	private int tstartm;
	private int tendh;
	private int tdauer;
	private String tname;
	private String twday;
	private final List<String> woche = new ArrayList<String>(Arrays.asList(
			"Montag".toLowerCase(), "Dienstag".toLowerCase(),
			"Mittwoch".toLowerCase(), "Donnerstag".toLowerCase(),
			"Freitag".toLowerCase(), "Samstag".toLowerCase(),
			"Sonntag".toLowerCase()));
	private boolean dummy = false;

	private final List<IKlasse> klist = new ArrayList<IKlasse>();
	private final List<ILehrkraft> llist = new ArrayList<ILehrkraft>();

	/**
	 * Erstellt eine Aktivitaet.
	 * 
	 * @param name
	 *            Name der Aktivitaet
	 * @param wochentag
	 *            Tag an dem die Aktivitaet stattfindet
	 * @param h
	 *            Stunde in der die Aktivtaet beginnt
	 * @param m
	 *            Minute in der die Aktivitaet beginnt
	 * @param dauer
	 *            Dauer der Aktivtaet
	 */
	public Aktivitaet(final String name, final String wochentag, final int h,
			final int m, final int dauer) {
		if (woche.contains(wochentag.toLowerCase()) && 0 <= h && h < 24
				&& 0 <= m && m < 60 && 0 < dauer) {
			tname = name;
			twday = wochentag;
			tstarth = h;
			tstartm = m;
			tdauer = dauer;
			tendh = h + dauer;

		} else {
			throw new IllegalArgumentException("Eingabe ist ungueltig.");
		}
	}

	/**
	 * Kosntruktor fuer die Dummy-Aktivitaet. Wichtig ist hier nur das Dummy auf
	 * true gesetzt wird.
	 * 
	 * @param name
	 * @param wochentag
	 * @param h
	 * @param m
	 * @param dauer
	 * @param dummy
	 *            muss bei dieser Version des Konstruktors auf True sein.
	 */
	public Aktivitaet(final String name, final String wochentag, final int h,
			final int m, final int dauer, final boolean dummy) {
		this(name, wochentag, h, m, dauer);
		this.dummy = dummy;
	}

	/**
	 * Gibt die Liste der Klassen zurueck.
	 * 
	 * @return List<IKlasse> Liste der Klassen
	 */
	@Override
	public List<IKlasse> getKlassen() {
		return klist;
	}

	/**
	 * Gibt die Liste der Lehrkraefte zurueck.
	 * 
	 * @return List<ILehrkraft> Liste der Lehrkraefte
	 */
	@Override
	public List<ILehrkraft> getLehrkraefte() {
		return llist;
	}

	/**
	 * Gibt den Startzeitpunkt samt Wochentag zurueck. In der Form
	 * "Wochentag // HH:MM" // sind Zeielnumbrueche
	 */
	@Override
	public String getZeitraum() {
		String min = tstartm + "";
		if (min.length() <= 1) {
			min = "0" + min;
		}
		return tstarth + ":" + min + " - " + (tdauer + tstarth) + ":" + min;
	}

	/**
	 * Gibt den Endzeitpunkt samt Wochentag zurueck. In der Form
	 * "Wochentag // HH:MM" // sind Zeielnumbrueche
	 */
	@Override
	public String getEnde() {
		return twday + "\n" + tendh + ":" + tstartm;
	}

	/**
	 * Setzt das neue Startdatum der Aktivitaet Valide Eingaben sind: 1. HH:MM
	 * 2. H:MM 3. HH 4. H Ueberpruft auf die Korrektheit der Zeitangaben. Diese
	 * Methode Aktualisiert ebenfalls den Endzeitpunkt.
	 * 
	 * @param start
	 *            Die neue Startzeit der Aktivitaet
	 */
	@Override
	public void setStart(final String start) {
		int xh = tstarth;
		int xm = tstartm;
		try {
			if (start.length() == 5) {
				xh = new Integer("" + start.charAt(0) + start.charAt(1));
				xm = new Integer("" + start.charAt(3) + start.charAt(4));
			} else if (start.length() == 4) {
				xh = new Integer("" + start.charAt(0));
				xm = new Integer("" + start.charAt(2) + start.charAt(3));
			} else if (start.length() == 2 || start.length() == 1) {
				xh = new Integer(start);
			}
		} catch (final NumberFormatException e) {
			throw new IllegalArgumentException("Eingabe ist nich valid");
		}

		if (0 <= xh && xh < 24 && 0 <= xm && xm < 60) {
			tstarth = xh;
			tstartm = xm;
			tendh = xh + tdauer;
		} else {
			throw new IllegalArgumentException("Eingabe ist nicht valid");
		}

	}

	/**
	 * Aktualisiert die Dauer der Aktivitaet. Die Dauer darf nur in Stunden
	 * ausgedrueckt werden. Die Methode ueberprueft nicht die Laenge der Dauer.
	 * Aktualisiert ebenfalls den Endzeitpunkt
	 * 
	 * @param d
	 *            Dauer der Aktivitaet, ganzzahlige Stunden
	 */
	@Override
	public void setDauer(final String d) {
		try {
			tdauer = new Integer(d);
			tendh = tstarth + tdauer;
		} catch (final NumberFormatException e) {
			throw new IllegalArgumentException(
					"Dauer ist keine gannzahlige angabe von stunden");
		}
	}

	/**
	 * Gibt den Namen der Aktivitaet zurueck
	 * 
	 * @return tname Namen der Aktivitaet
	 */
	@Override
	public String getName() {
		return tname;
	}

	/**
	 * Setzt den neuen Namen der Aktivitaet
	 * 
	 * @param name
	 *            Der neue Name der Aktivitaet
	 */
	@Override
	public void setName(final String name) {
		tname = name;
	}

	/**
	 * Fuegt eine Klasse zu dieser Aktivitaet hinzu Die Methode prueft ob der
	 * Parameter null ist und ob die Klasse bereits vorhanden ist, anhand des
	 * Namens.
	 * 
	 * @param klasse
	 *            Klasse die hinzugefuegt werden soll
	 */
	@Override
	public void addKlasse(final IKlasse klasse) {
		if (klasse == null) {
			throw new IllegalArgumentException("klasse ist null");
		} else {
			if (1 <= klist.size()) {
				for (int i = 0; i < klist.size(); i++) {
					if (klist.get(i).getName() == klasse.getName()) {
						throw new IllegalArgumentException(
								"Klasse bereits vorhanden");
					}
				}
				klist.add(klasse);
			} else {
				klist.add(klasse);
			}
		}
	}

	/**
	 * Fuegt eine Lehrkraft zu dieser Aktivitaet hinzu. Ueberpruft ob der
	 * Paramet null ist und ob die Lehrkraft bereits vorhanden ist.
	 * 
	 * @param lehrkraft
	 *            Lehrkraft die hinzugefuegt werden soll
	 */
	@Override
	public void addLehrkraft(final ILehrkraft lehrkraft) {
		if (lehrkraft == null) {
			throw new IllegalArgumentException("leahrkraft ist null");
		} else {
			if (1 <= llist.size()) {
				for (int i = 0; i < llist.size(); i++) {
					if (llist.get(i).equals(lehrkraft)) {
						throw new IllegalArgumentException(
								"Lehrkraft bereits vorhanden");
					}
				}
				llist.add(lehrkraft);
			} else {
				llist.add(lehrkraft);
			}
		}
	}

	/**
	 * Entfernt die Lehrkraft aus dieser Aktivitaet. Ueberprueft ob der
	 * Parameter null ist und ob die Lehrkaft ueberhaupt in der Aktivitaet
	 * vorhanden ist.
	 * 
	 * @param l
	 *            Lehrkraft die entfernt werden soll.
	 */
	@Override
	public void removeLehrkraft(final ILehrkraft lehrkraft) {
		if (lehrkraft == null) {
			throw new IllegalArgumentException("lehrkraft ist null");
		} else if (llist.contains(lehrkraft)) {
			llist.remove(llist.indexOf(lehrkraft));
		} else {
			throw new IllegalArgumentException("lehrkraft nicht vorhanden");
		}
	}

	/**
	 * Entfernt die Klasse aus diese Aktivitaet. Ueberprueft ob der Parameter
	 * null ist und ob die Klasse ueberhaupt in der Aktivitaet vorhanden ist.
	 * 
	 * @param k
	 *            Klasse die entfernt werden soll.
	 */
	@Override
	public void removeKlasse(final IKlasse k) {
		if (k == null) {
			throw new IllegalArgumentException("klasse is null");
		} else if (klist.contains(k)) {
			klist.remove(klist.indexOf(k));
		} else {
			throw new IllegalArgumentException("klasse nicht vorhanden");
		}
	}

	/**
	 * Gibt die Dauer der Aktivitaet zurueck
	 * 
	 * @param Dauer
	 *            der Aktivitaet
	 */
	@Override
	public int getDauer() {
		return tdauer;
	}

	/**
	 * getter fuer die Startstunde
	 * 
	 * @return die Startstunde
	 */
	@Override
	public int getStartHour() {
		return tstarth;
	}

	/**
	 * getter fuer die Startminute
	 * 
	 * @return die Startminute
	 */
	@Override
	public int getStartMinute() {
		return tstartm;
	}

	/**
	 * getter fuer den Wochentag
	 * 
	 * @return der Wochentag der Aktivitaet
	 */
	@Override
	public String getWochentag() {
		return twday;
	}

	/**
	 * Gibt die ID der Aktivitaet zurueck.
	 * 
	 * @return int ID
	 */
	@Override
	public int getId() {
		return iD;
	}

	/**
	 * Setzt die ID der Aktivitaet
	 * 
	 * @param n
	 *            ID
	 */
	public void setId(final int n) {
		iD = n;
	}

	/**
	 * Gibt zurueck ob die Aktivitaet ein Dummy ist. Die Dummys fuellen die
	 * Stundenplaene um sie darzustellen, sind aber nicht in der Datenbank.
	 * 
	 * @return
	 */
	@Override
	public boolean isDummy() {
		return dummy;
	}

	/**
	 * Gibt die Startuhrzeit in der Form HH:MM aus
	 * 
	 * @return startuhrzeit
	 */
	@Override
	public String getStart() {
		return "" + tstarth + ":" + tstartm;
	}
}
